#ifndef QUERYOBJECT_H
#define QUERYOBJECT_H

#include <QThread>
#include <QQueue>
#include <QMutex>
#include <QDebug>

#include "IQueryManager.h"
#include "Core.h"
#include "Command/ICommand.h"



namespace Common {

class QueryManager : public QThread, public IQueryManager
{
	Q_OBJECT

public:
	explicit QueryManager(Core& core, QObject *parent = 0);
	virtual ~QueryManager();

public slots:
	void processResponse(QByteArray& data);

public:

	/**
	 * Добавить команду в очередь
	 * \param command команда
	 */
	void addCommand(ICommand::SPtr command);

private:
	/*!
		* Тело рабочего потока.
		*/
	void run();

	/*!
		* Ожидание вполнения команды.
		* \param transact команда
		* \param page ядро
		*/
	void waitResponse();

private slots:
	void execute();

private:
	ICommand::SPtr                      _command;               /*!< Текущая команда, ожидающая ответа */
	QQueue<ICommand::SPtr>              _waitingQueue;          /*!< Очередь команд, ожидающих ответа */
	QQueue<ICommand::SPtr>              _unwaitingQueue;        /*!< Очередь команд, которые не требуют ответа */
	QMutex                              _queueMutex;            /*!< Мьютекс, защищающий очередь команд */
	Core&                               _core;                  /*!< Ядро */
	bool                                _isLocked;              /*!< Флаг блокировки выполения комманд */
};
}

#endif // QUERYOBJECT_H
